你可以從他的名字中看出一些端倪,MelGan 顧名思義就是用 GAN 去達成的
就是在 Day6 中介紹的那個 hop_length
再看一次上面的圖,因為 MelGan 用的輸入聲音 Sampling rate 為 22.05Khz, 而它的 n_fft = 1024 和 librosa 預設的不同,所以 hop_length = 256,看一下上面的 Upsampling 數等於
[8X] X [8X] X [2X] X [2X] = 256
輸入是 Ground_truth waveform + Generator 生成的 waveform
在 MelGan 裡面用到的 Discriminator 是 multi-scale discriminator,這種架構就是原本只用一個 Discriminator 現在改用 N 個 (這邊是 3),然後把輸入做 average pooling 然後送到各個 Discriminator (如下圖所示),這樣做的原因是 MelGan 假設了接收不同 scale 資料的 discriminator 可以學習到不同頻段的特徵。
每個 Discriminator 的結構如下圖所示,這邊的 DownSampling 一樣不是 keras.layer 裡面DownSampling,只是單純用 Conv 然後 stride 控制 DownSampling 的 shape 而已。接著只拿最後一層的 Output 跟倒數第二層的 Feature maps 去算 hinge loss。
但是要訓練這東西,據說在 V100 上面要訓練半個月
所以我們不會自己訓練這個 XD,我們就直接拿來用,去官方上的 Github 下載完整的 code 還包含 Pre-trained model (預設是使用 multi_speaker.pt 這個)。
在使用之前,請先確保你的 waveform 資料經過了這些處理,而且 sampling_rate 是 22.05khz
# 不是 22.05khz 的話請先 resample
x = librosa.resample(x, fs, target_fs)
def mel_gan_handler(x, fft_length = 1024, hop_length = 256,sr = 22050):
wav = normalize(x)
p = (fft_length - hop_length) // 2
wav = np.squeeze(np.pad(wav, (p, p), "reflect"))
fft = librosa.stft(
wav,
n_fft = fft_length,
hop_length = hop_length,
window = 'hann',
center = False
)
# 這裡的 abs 是 sqrt(實部**2 + 虛部**2)
mag = abs(fft)
mel_basis = mel(sr, 1024, fmin = 0.0 , fmax=None, n_mels=80)
mel_output = np.dot(mel_basis,mag)
log_mel_spec = np.log10(np.maximum(1e-5,mel_output)).astype(np.float32)
return log_mel_spec
注意,這裡輸入的 mel shape = ( 1,80,x ) 而且是 torch tensor
import IPython.display as ipd
import torch
import numpy as np
from interface import *
vocoder = MelVocoder()
audio = np.squeeze(vocoder.inverse(mel).cpu().numpy())
ipd.Audio(audio,rate = 22050)
這樣就完成了!
今天我們簡單介紹了 MelGan,也在 pytorch 上 Inference 它,雖然還有很多其他不同的 Vocoder,但接下來要介紹的是另一個在 Auto_VC 上用到的 Model 所以 Vocoder 的部分就先暫時告一段落吧 ~~~